package org.groupg.poi.word;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import java.io.*;
import java.util.Arrays;
import java.util.List;

public class DocWatermarkInserter {

    /**
     * 为.doc文档添加图片水印
     *
     * @param inputFile      输入文件
     * @param outputFile     输出文件
     * @param watermarkImage 水印图片字节数组
     */
    public static void addImageWatermarkToDoc(File inputFile, File outputFile,
                                              byte[] watermarkImage) {
        try (FileInputStream fis = new FileInputStream(inputFile);
             HWPFDocument doc = new HWPFDocument(fis);
             FileOutputStream fos = new FileOutputStream(outputFile)) {

            // 获取文档范围
            Range range = doc.getRange();

            // 创建图片对象
            PicturesTable picturesTable = doc.getPicturesTable();
            List<Picture> pictures = picturesTable.getAllPictures();

            Picture picture = new Picture(pictures.size(), watermarkImage, false);
            pictures.add(picture);
            int pictureIndex = pictures.size() - 1;

            // 获取或创建页眉
            HeaderStories headerStories = new HeaderStories(doc);

            // 清除可能存在的旧水印
            clearExistingWatermarks(headerStories);

            // 在页眉中插入图片
            insertWatermarkIntoHeader(doc, headerStories, pictureIndex,
                    picturesTable, range);

            // 保存文档
            doc.write(fos);

        } catch (Exception e) {
            throw new RuntimeException("添加水印失败", e);
        }
    }

    /**
     * 清除可能存在的旧水印
     */
    private static void clearExistingWatermarks(HeaderStories headerStories) {
        // 这里可以添加清除逻辑
        // HWPF 的页眉操作相对复杂，可能需要遍历所有页眉段落
    }

    /**
     * 将水印图片插入页眉
     */
    private static void insertWatermarkIntoHeader(HWPFDocument doc,
                                                  HeaderStories headerStories,
                                                  int pictureIndex,
                                                  PicturesTable picturesTable,
                                                  Range range) {
        try {
            // HWPF 插入图片到页眉比较复杂
            // 这里提供一个替代方案：将图片插入到文档开头，然后调整位置

            // 在文档开头插入一个段落用于放置水印图片
            range.insertBefore("\u000c"); // 插入分页符
            range = doc.getRange(); // 重新获取range

            // 创建字符运行并插入图片
            CharacterRun run = range.insertAfter("");
            run.setPicture(pictureIndex);
            doc.getPicturesTable().getAllPictures();

            // 设置图片属性（这些属性在HWPF中可能有限）
            // 注意：HWPF对图片格式的支持不如XWPF丰富

        } catch (Exception e) {
            throw new RuntimeException("插入水印到页眉失败", e);
        }
    }
}